What happens when we apply unsuperised learning to musical recordings?
Can we find specific notes?
| id | composer | composition | movement | ensemble | source | transcriber | catalog_name | seconds | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1727 | Schubert | Piano Quintet in A major | 2. Andante | Piano Quintet | European Archive | http://tirolmusic.blogspot.com/ | OP114 | 447 |
| 1 | 1728 | Schubert | Piano Quintet in A major | 3. Scherzo: Presto | Piano Quintet | European Archive | http://tirolmusic.blogspot.com/ | OP114 | 251 |
| 2 | 1729 | Schubert | Piano Quintet in A major | 4. Andantino - Allegretto | Piano Quintet | European Archive | http://tirolmusic.blogspot.com/ | OP114 | 444 |
| 3 | 1730 | Schubert | Piano Quintet in A major | 5. Allegro giusto | Piano Quintet | European Archive | http://tirolmusic.blogspot.com/ | OP114 | 368 |
| 4 | 1733 | Schubert | Piano Sonata in A major | 2. Andantino | Solo Piano | Museopen | Segundo G. Yogore | D959 | 546 |
array(['Piano Quintet', 'Solo Piano', 'Piano Trio', 'Viola Quintet',
'String Quartet', 'Clarinet Quintet',
'Pairs Clarinet-Horn-Bassoon', 'Wind Quintet', 'Accompanied Cello',
'Accompanied Clarinet', 'Wind and Strings Octet', 'String Sextet',
'Piano Quartet', 'Horn Piano Trio', 'Solo Violin', 'Solo Flute',
'Solo Cello', 'Violin and Harpsichord',
'Clarinet-Cello-Piano Trio', 'Accompanied Violin', 'Wind Octet'],
dtype=object)
ensemble Solo Cello 12 Solo Flute 3 Solo Piano 156 Solo Violin 9 Name: id, dtype: int64
University of Rochester Multi-Modal Performance Dataset
http://www2.ece.rochester.edu/projects/air/projects/URMP.html
| file_path | |
|---|---|
| instrument | |
| Bassoon | 3 |
| Cello | 11 |
| Clarinet | 10 |
| Double Bass | 3 |
| Flute | 18 |
| Horn | 5 |
| Oboe | 6 |
| Saxophone | 11 |
| Trombone | 8 |
| Trumpet | 22 |
| Tuba | 5 |
| Viola | 13 |
| Violin | 34 |
URMP (13 instruments) + MusicNet (4 instuments) - overlap (3 instruments) = unique (14 instruments)
14 instruments * 3 recordings/instrument = 42 recordings
Initial process:
Recordings:
| id | composer | composition | movement | instrument | source | transcriber | catalog_name | seconds | file_path | |
|---|---|---|---|---|---|---|---|---|---|---|
| 161 | 2296 | Bach | Cello Suite 4 | 4. Sarabande | Cello | European Archive | David J. Grossman | BWV1010 | 291 | musicnet/2296.wav |
| 160 | 2295 | Bach | Cello Suite 4 | 3. Courante | Cello | European Archive | David J. Grossman | BWV1010 | 259 | musicnet/2295.wav |
| 127 | 2218 | Bach | Cello Suite 3 | 2. Allemande | Cello | European Archive | David J. Grossman | BWV1009 | 199 | musicnet/2218.wav |
| 114 | 2202 | Bach | Partita in A minor | 1. Allemande | Flute | Scott Goff | David J. Grossman | BWV1013 | 181 | musicnet/2202.wav |
| 115 | 2203 | Bach | Partita in A minor | 2. Corrente | Flute | Scott Goff | David J. Grossman | BWV1013 | 156 | musicnet/2203.wav |
Fourier Transform (F. T.) illustration
Realistic F.T.
PCA by Instrument
t-SNE by Instrument
UMAP by Instrument

PCA
t-SNE
UMAP
_ = plt.figure(figsize=(12,8))
umap_df = reduce_dimension(ft, UMAP, {'n_neighbors':5, 'min_dist':0.005, 'metric':'correlation'})
_ = plt.figure(figsize=(10,7))
umap_dbscan_df = cluster_2D(umap_df, DBSCAN, {'eps':0.6, 'min_samples':7}, show_plot=True)
0
1
11
15

Each cluster is assigned the frequency of the longest interval(s) in the cluster.
Frequency fitting:
cluster_fundamental_freqs
{1: 294.43359375,
2: 351.5625,
3: 442.55514705882354,
4: 591.796875,
5: 660.64453125,
6: 700.78125,
7: 796.875,
9: 556.640625,
10: 890.625,
11: 938.8786764705882,
12: 523.4375,
15: 388.7867647058824,
17: 494.31818181818187}
What if we find the frequency of each interval (instead of each cluster)?
All intervals are assigned their cluster frequency.
Intervals are fit individually. Failed fits default to cluster frequency.